//使用let声明的变量不能重复被声明
// {
//     var a = 1;
//     let a = 2;
//     console.log(a);
// }
// console.log(a);
// (function(){
//     var a = 1;
// })()

// {
//     var a = 1;//块作用域对var声明的无效
//     let b = 2;
// }
// console.log(a);
// console.log(b);//对let声明的有效，会报错

// {
//     //let声明的变量仅在当前作用域中有效
//     for(let i=0;i<10;i++){}
//     console.log(i);
// }

// {
    // js代码执行过程
    //1 预解释 ： 全盘扫 var 和 function 函数名(){}的内容，找到之后，var声明的便令进行预解释，只声明不赋值。对于function 声明的函数，声明并且赋值
    // fn();
    // var fn = function(){
    //
    // }

    //2 代码从上到下执行

//     console.log(a);
//     sum();
//     var a = 1;
//     function sum(){
//         console.log('sum');
//     }
//     console.log(a);
// }

// {
//     var a = [];
//     for (var i = 0; i < 10; i++) {
//         a[i] = function () {
//             console.log(i);
//         };
//     }
//     a[6]();
// }

// {
//     var a = [];
//     for (let i = 0; i < 10; i++) {
//         a[i] = function () {
//             console.log(i);
//         };
//     }
//     a[6]();
// }

// for (let i = 0; i < 3; i++) {
//     console.log(i);
//     let i = 'abc';
//     console.log(i);
// }
// {
//     console.log(foo);
//     var foo = 2;
//     // let 的情况
//     console.log(bar);
//     let bar = 2;
// }

// {
//     var tmp = 123;
//     if (true) {
//         console.log(tmp);
//         tmp = 'abc'; // ReferenceError
//         console.log(tmp);
//         let tmp;
//         console.log(tmp);
//     }
// }

// {
//     if(true){
//         let a = 123;
//     }
//     console.log(a);
// }
//
// {
//     var s = 'hello';
//     for (let i = 0; i < s.length; i++) {
//         console.log(i);
//     }
//     console.log(i); // 5
// }
// {
//     function f1() {
//         let n = 5;
//         if (true) {
//             let n = 10;
//         }
//         console.log(n);
//     }
//     f1();
// }


// IIFE 写法
// (function () {
//     var tmp = ...;
//     ...
// }());

// 块级作用域写法
// {
//     let tmp = ...;
//     ...
// }
//
//-========let总结
// 1. 在一个作用域中 let 不能重复声明同一个变量。报错
// 2. let声明的变量，仅在当前块作用域中有效


//==========const 声明一个常量

// {
//     const a = 1;
//     a = 2;//1.声明过的常量，不能被赋值，报错
//     console.log(a);
// }

// {
//     //常量必须在声明的时候赋值
//     const b;
//     // b = 2;
//     console.log(b);
// }

// {
//     if (true) {
//         const MAX = 5;
//     }
//     console.log(MAX)
// }

// {
//     let a = 222;
//     var a = 123;
//     const a = 555;
//     console.log(a);
// }
//
